package com.situ.mall.admin.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.situ.mall.admin.entity.User;
import com.situ.mall.admin.mapper.UserMapper;
import com.situ.mall.admin.service.IUserService;
import com.situ.mall.admin.vo.UserVO;
import com.situ.mall.common.exception.MyException;
import com.situ.mall.common.util.RequestUtil;
import com.situ.mall.common.util.StringUtil;
import com.situ.mall.common.vo.TableVO;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author JavaWizard
 * @since 2023-09-11
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    //登陆验证
    @Override
    public boolean check(String username, String password) {
        //先拿着用户名去数据库查
        User u = baseMapper.selectByUsername(username);
        //查不到，说明用户名都不对
        if (u == null){
            throw new MyException("用户名错误");
        }
        //用户状态为-1，提示已停用
        if (u.getStatus().equals("-1")){
            throw new MyException("用户已停用，请联系管理员处理");
        }
        //用户状态为1，提示查不到此用户
        if (u.getStatus().equals("1")){
            throw new MyException("用户已注销");
        }
        //两个条件必须同时满足
        //如果能查到用户,把传过来的密码进行加密，与根据用户名查到的加密后的密码进行比较
        boolean b = u.getPassword().equals(StringUtil.md5(password));
        //如果b为true，用户名和密码都正确，打上标记，登录
        if (b) {
            //把当前用户对象，保存进session
            RequestUtil.setCurrent(u);
        }else {
            throw new MyException("密码错误");
        }
        return true;
    }

    //查询用户表格
    @Override
    public TableVO table(Integer page, Integer limit, String username, String phoneNumber) {
        //PageHelper 分页小工具
        PageHelper.startPage(page, limit);
        //上边这行代码后跟的第一次查数据库是分页查询，只生效一次！！！
        List<UserVO> list = baseMapper.list(username, phoneNumber);
        return TableVO.data(list);
    }

    //保存 新增保存 or 编辑保存
    @Override
    public void saveUser(User user) {
        //判断是否用户名重复
        User u = baseMapper.selectByUsername1(user.getUsername(), user.getId());
        //如果根据用户名查到了，说明用户名重复，不能添加用户
        if (u != null) {
            throw new MyException("用户名已经被使用");
        }
        //查电话号码长度是不是11位
        if (user.getPhoneNumber().length() != 11) {
            throw new MyException("电话号码有误，请重新输入");
        }
        //查电话号码是不是0-9纯数字
        for (int i = 0; i < 11; i++) {
            char c = user.getPhoneNumber().charAt(i);
            if (c < '0' || c > '9') {
                throw new MyException("电话号码有误，请重新输入");
            }
        }
        //如果没传状态码，指定状态码为0，放到里面
        if (user.getStatus() == null || user.getStatus().isEmpty()) {
            user.setStatus("0");
        }
        //判断是新增还是编辑
        if (user.getId() == null) {
            //取出前台传回的密码进行加密，加密后再保存进数据库
            user.setPassword(StringUtil.md5(user.getPassword()));
            //获取当前时间，放到里面
            user.setCreateTime(LocalDateTime.now());
            baseMapper.save(user);//新增保存
        } else {
            //判断被编辑的用户是不是当前登陆用户，且更改了状态
            if (!Objects.equals(user.getStatus(), "0") && user.getId().equals(((User) RequestUtil.getSession().getAttribute("currentUser")).getId())){
                throw new MyException("当前用户正在登陆中");
            }
            //编辑不更新密码
            baseMapper.update(user);//编辑保存
        }
    }

    //删除
    @Override
    public void delete(Integer id) {
        User u = baseMapper.selectById(id);
        //如果是管理员账号，删不了
        if (u.getTypeId() == 1) {
            throw new MyException("此账号是管理员账号，不能删除");
        }
        //如果是当前登录用户，删不了
        if (id.equals(((User) RequestUtil.getSession().getAttribute("currentUser")).getId())){
            throw new MyException("当前用户正在登陆中");
        }
        baseMapper.delete(id);

    }

    //编辑——根据ID查询该行数据带到前台
    @Override
    public User selectById(Integer id) {
        User u = baseMapper.selectById(id);
        //把查到的用户的密码设置成null
        u.setPassword(null);
        return u;
    }

}
